package cn.edu.ctbu.web.service;


import cn.edu.ctbu.web.dao.TeacherCourse;
import cn.edu.ctbu.web.dao.TeacherGrade;
import cn.edu.ctbu.web.domain.Student;
import cn.edu.ctbu.web.domain.Teacher;
import cn.edu.ctbu.web.mapper.CourseMapper;
import cn.edu.ctbu.web.mapper.GradeMapper;
import cn.edu.ctbu.web.repository.TeacherRepository;
import cn.edu.ctbu.web.service.impl.ITeacherService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class TeacherService implements ITeacherService {
    @Autowired
    private TeacherRepository teacherRepository;

    @Resource
    CourseMapper courseMapper;

    @Resource
    GradeMapper gradeMapper;

    /**
     * 使用教师编号+密码进行登录
     * @param no 教师编号
     * @param password 密码
     * @return 与教师编号和密码匹配的教师
     */
    public List<Teacher> findByNoAndPassword(String no, String password) {
        return teacherRepository.findByNoAndPassword(no, password);
    }

    /**
     * 使用教师编号来查询教师个人信息
     * @param no 教师编号
     * @return 教师个人信息
     */
    public Teacher findByNo(String no) {
        return teacherRepository.findByNo(no);
    }

    /**
     * 使用教师编号查询授课信息
     * @param no 教师编号
     * @return 授课信息
     */
    public Page<TeacherCourse> findCourseByNoTeacher(@Param("no") String no, Pageable pageable){
        // 获取所有符合条件的课程
        List<TeacherCourse> allCourses = courseMapper.findCourseByNoTeacher(no, pageable);

        // 获取总记录数
        long total = courseMapper.countCourseByNoTeacher(no);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allCourses.size());
        List<TeacherCourse> pageContent = allCourses.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 使用教师编号查询授课课程学生信息
     * @param no 教师编号
     * @return 授课课程学生信息
     */
    public Page<TeacherGrade> findGradeByNoTeacher(@Param("no") String no, Pageable pageable){
        // 获取所有符合条件的课程
        List<TeacherGrade> allGrades = gradeMapper.findGradeByNoTeacher(no, pageable);

        // 获取总记录数
        long total = gradeMapper.countGradeByNoTeacher(no);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allGrades.size());
        List<TeacherGrade> pageContent = allGrades.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 查找所有教师的信息——用于admin实现显示教师信息功能
     * @param pageable pageable
     * @return 所有教师的信息
     */
    public Page<Teacher> findAllTeacher(Pageable pageable){
        return teacherRepository.findAll(pageable);
    }

    /**
     * 查找所有教师的信息——用于反强制进入主页
     * @return 所有教师的信息
     */
    public List<Teacher> findAllTeacher(){
        return teacherRepository.findAll();
    }

    /**
     * Teacher 增、删、改、查
     * {操作名}{操作对象}{使用层}
     **/

    /**
     * 根据课程编号查询该课程所有学生的成绩
     * @param cno 课程编号
     * @param pageable 分页信息
     * @return 分页对象
     */
    public Page<TeacherGrade> searchGradeTeacher(@Param("cno") String cno, Pageable pageable){
        // 获取所有符合条件的课程
        List<TeacherGrade> allGrades = gradeMapper.searchGradeTeacher(cno, pageable);

        // 获取总记录数
        long total = gradeMapper.countGradeTeacher(cno);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allGrades.size());
        List<TeacherGrade> pageContent = allGrades.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 根据课程编号和学生学号删除学生成绩信息
     * @param cno 课程编号
     * @param sno 学生学号
     */
    public void deleteGradeTeacher(@Param("cno") String cno, @Param("sno") String sno){
        gradeMapper.deleteGradeTeacher(cno, sno);
    }

    /**
     * 根据课程编号、学生学号和学生成绩新增学生成绩信息
     * @param cno 课程编号
     * @param sno 学生学号
     * @param grade 课程成绩
     */
    public void insertGradeTeacher(@Param("cno") String cno, @Param("sno") String sno, @Param("grade") int grade){
        gradeMapper.insertGradeTeacher(cno, sno, grade);
    }

    /**
     * 根据课程编号、学生学号和课程成绩修改学生成绩信息
     * @param cno 课程编号
     * @param sno 学生学号
     * @param grade 课程成绩
     */
    public void updateGradeTeacher(@Param("cno") String cno, @Param("sno") String sno, @Param("grade") int grade){
        gradeMapper.updateGradeTeacher(cno, sno, grade);
    }

    /**
     * 根据教师编号寻找教师授课课程
     * @param tno 教师编号
     * @return 授课课程信息
     */
    public List<TeacherCourse> findCourseByTno(@Param("tno") String tno){
        return courseMapper.findCourseByTno(tno);
    }

    /**
     * 按名字进行查询
     * @param pageable 未
     * @param name 学生姓名
     * @return studentrepository.findByName(name, pageable)
     */
    public Page<Teacher> findByName(String name, Pageable pageable) {
        return teacherRepository.findByName(name, pageable);
    }

    /**
     * 按学号进行查询
     * @param pageable 未
     * @param no 学生学号
     * @return studentrepository.findByNo(no, pageable)
     */
    public Page<Teacher> findByNo(String no, Pageable pageable) {
        return teacherRepository.findByNo(no, pageable);
    }

    /**
     * 按id进行查询
     * @param pageable 未
     * @param id 学生id
     * @return studentrepository.findById(id, pageable);
     */
    public Page<Teacher> findById(Integer id, Pageable pageable) {
        return teacherRepository.findById(id, pageable);
    }

    /***
     *  更新
     *  更新职工信息
     * @return
     */
    public Teacher update(Teacher teacher) {

        teacherRepository.save(teacher);
        return teacher;
    }

    /***
     *  删除
     *  删除职工信息
     */
    public void delete(Teacher teacher) {
        teacherRepository.delete(teacher);
    }

    /**
     * 按id进行查询 - updata
     * @param id 学生id
     * @return studentrepository.findById(id).orElse( null)
     */
    public Teacher findById(Integer id) {
        return teacherRepository.findById(id).orElse( null);
    }

    /**
     * 新增学生表信息
     * @param teacher 学生对象
     * @return student
     */
    public Teacher insert(Teacher teacher) {
        teacherRepository.save(teacher);
        return teacher;
    }
}
